package com.zsr.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.zsr.pojo.Person;
import com.zsr.pojo.User;
import com.zsr.utils.JsonUtils;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * @Author zsr
 * @Desc 处理json
 * @Date 2021/4/30 23:22
 */
@Controller
@RequestMapping("/json")
@ControllerAdvice
public class HandleJsonController {
    /*
	 	处理JSON的注解:
	 		ResponseBody: 处理响应,把对象转换为JSON字符串.
	 			贴到方法上:只针对当前方法做JSON处理.
	 			贴到类上   : 会对当前类中所有的方法做JSON处理.

	 		RestController = Controller + ResponseBody

	 		RequestBody: 处理请求,用于读取HTTP请求的内容,把JSON格式的请求数据封装成对象.

	 		一般的请求的数据格式:
	 			application/x-www-form-urlencoded: 传统的key-value格式,处理起来非常方便. 不需要RequestBody都可以,贴上也可以.
	 			application/multipart:文件上传的请求,SpringMVC装设设计模式,.既能处理文件上传,也能处理普通表单数据.
	 			application/json:	参数是JSON格式的,此时必须使用RequestBody.

	 */
    // 把单个对象/Map转换为JSON格式
    @RequestMapping("/test1")
    @ResponseBody
    public User test1() {
        User u = new User();
        u.setUsername("桂朝阳");
        u.setAge(22);
        //{"username":"桂朝阳","age":22}
        return u;
    }

    // 把集合转为JSON格式
    @RequestMapping("/test2")
    @ResponseBody
    public List<User> test2() {
        User u = new User();
        u.setUsername("桂阳");
        u.setAge(22);
        //[{"username":"桂阳","age":22},{"username":"桂阳","age":22},{"username":"桂阳","age":22}]
        return Arrays.asList(u, u, u);
    }

    //日期类型处理
    // 从前台--->后台传递参数: String ---> java.util.Date  /json/test3?d=2010-11-1
    @RequestMapping("/test3")
    public ModelAndView test3(@DateTimeFormat(pattern = "yyyy-MM-dd") Date d){
        System.out.println(d);
        //Mon Nov 01 00:00:00 CST 2010
        return null;
    }
    @RequestMapping("/t3")
    public ModelAndView t3(Date d){
        System.out.println(d);
        //Mon Nov 01 00:00:00 CST 2010
        return null;
    }

    //日期类型处理
    //方式二
    //  json/test4?id=2&username=zy&age=23&hiredate=2020-2-1
    @RequestMapping("/test4")
    public ModelAndView test4(Person person){
        System.out.println(person);
        //Person(id=2, username=zy, age=23, hiredate=Sat Feb 01 00:00:00 CST 2020)
        return null;
    }

    //日期类型处理
    //方式三
    //如果不想每次都在Date类型上@DateTimeFormat  使用@ControllerAdvice注解
    //测试 t3  可以生效
    @InitBinder
    public void initBinderDateType(WebDataBinder binder) {
        SimpleDateFormat sdf = new SimpleDateFormat();
        sdf.applyPattern("yyyy-MM-dd");
        binder.registerCustomEditor(java.util.Date.class, new CustomDateEditor(sdf, true));
    }

    @RequestMapping("/test5")
    @ResponseBody
    public Person test5(){
        Person person = new Person();
        person.setUsername("will");
        person.setAge(82);
        person.setHiredate(new Date());
        return person;
        //{"id":null,"username":"will","age":82,"hiredate":"2021-05-01 11:09:37"}
    }


    //-----狂神教学
    //会乱码
    @RequestMapping("/json1")
    @ResponseBody
    public String json1() throws JsonProcessingException {
        //创建一个jackson的对象映射器，用来解析数据
        ObjectMapper mapper = new ObjectMapper();
        //创建一个对象
        User user = new User("秦疆1号", 3);
        //将我们的对象解析成为json格式
        String str = mapper.writeValueAsString(user);
        //由于@ResponseBody注解，这里会将str转成json格式返回；十分方便
        return str;
    }

    @RequestMapping("/json2")
    @ResponseBody()
    public String json2() throws JsonProcessingException {

        //创建一个jackson的对象映射器，用来解析数据
        ObjectMapper mapper = new ObjectMapper();
        //创建一个对象
        User user1 = new User("秦疆1号", 3);
        User user2 = new User("秦疆2号", 3);
        User user3 = new User("秦疆3号", 3);
        User user4 = new User("秦疆4号", 3);
        List<User> list = new ArrayList<User>();
        list.add(user1);
        list.add(user2);
        list.add(user3);
        list.add(user4);

        //将我们的对象解析成为json格式
        String str = mapper.writeValueAsString(list);
        return str;
    }

    @RequestMapping("/json3")
    @ResponseBody()
    public String json3() throws JsonProcessingException {

        ObjectMapper mapper = new ObjectMapper();

        //创建时间一个对象，java.util.Date
        Date date = new Date();
        //将我们的对象解析成为json格式
        String str = mapper.writeValueAsString(date);
        return str;
        //输出 1619839094547
    }

    @RequestMapping("/json4")
    @ResponseBody()
    public String json4() throws JsonProcessingException {

        ObjectMapper mapper = new ObjectMapper();

        //不使用时间戳的方式
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        //自定义日期格式对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //指定日期格式
        mapper.setDateFormat(sdf);

        Date date = new Date();
        String str = mapper.writeValueAsString(date);

        return str;
        // 输出 "2021-05-01 11:19:12"
    }

    @RequestMapping("/json5")
    @ResponseBody()
    public String json5() throws JsonProcessingException {
        Date date = new Date();
        String json = JsonUtils.getJson(date);
        return json;
    }
}
